# 트랜잭션과 무결성

# 트랜잭션

정의

트랜잭션은 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말합니다.

  • 데이터베이스에 접근하는 방법은 쿼리이므로, 여러개의 쿼리들을 하나로 묶는 단위를 말합니다.
  • ACID: 원자성, 일관성, 독립성, 지속성이라는 특징을 지닙니다.

# 원자성 (Atomicity)

All or Nothing

정의

원자성은 트랙잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징입니다.

  • 트랜잭션을 커밋했는데, 문제가 발생하여 롤백하는 경우, 모두 수행 되지 않음을 보장합니다.
  • 트랜잭션 단위로 여러 로직들을 묶을 때 외부 API를 호출하는 것이 있으면 안됩니다.
  • 만약 존재한다면 롤백이 일어났을 때 어떻게 해야할 것인지 해결방법이 있어야 하며, 트랜잭션 전파를 신경써서 관리해야 합니다.

# Commit

정의

커밋은 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어입니다. 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것을 말합니다.

  • 커밋이 수행되었다를 하나의 트랜잭션이 성공적으로 수행되었다고도 말합니다.
  • 애러나 여러 이슈 때문에 트랜잭션 전으로 돌려야 한다면, 이때 롤백을 사용합니다.

# RollBack

정의

롤백이란 트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일을 말합니다.

  • 커밋과 롤백을 통해 데이터의 무결성이 보장됩니다.
  • 데이터 변경 전에 변경 사항을 쉽게 확인할 수 있고 해당 작업을 그룹화 할 수 있습니다.

# 트랜잭션 전파

트랜잭션을 수행할 때 커넥션 단위로 수행하기에 커넥션 객체를 넘겨서 수행해야 하는데, 이 행위가 어렵고 귀찮습니다.

정의

여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것을 트랜잭션 전파라고 합니다.

# 일관성 (Consistency)

정의

일관성이란 '허용된 방식'으로만 데이터를 변경해야 하는 것을 의미합니다.

  • 데이터베이스에 기록된 모든 데이터는 여러 가지 조건, 규칙에 따라 유효함을 가져야 합니다.
  • 예로 0원이 있는 사람이 출금을 할 수 없을 것이다.

# 격리성 (Isolation)

정의

격리성이란 트랜잭션 수행 시 서로 끼어들지 못하는 것을 말합니다.

  • 복수의 병렬 트랜잭션은 서로 격리되어 마치 순차적으로 실행되는 것처럼 작동되어야 합니다.
  • 데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 합니다.
  • 그렇다고 모두 순차적으로 할 경우 성능 저하가 발생하기에, 격리 수준으로 나눠 병렬적으로 수행합니다.

image

  • 격리 수준은 SERIALIZABLE, REPEATABLE READ, READ COMMITTED, READ UNCOMMITTED가 있으며 위로 갈수록 동시성(성능)이 강해지지만, 격리성은 약해집니다.
  • REPEATABLE READ에서는 팬텀리드 현상이 발생합니다.
  • READ COMMITTED에서는 팬텀리드와 반복 가능하지 않은 조회가 발생합니다.
  • READ UNCOMMITTED는 팬텀리드, 반복 가능하지 않은 조회, 더티 리드가 발생합니다.

# 격리 수준에 따라 발생하는 현상

# 팬텀 리드 (Phantom Read)

정의

팬텀 리드란 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우를 말합니다.

  • Transaction1이 실행 중에 특정 조건으로 데이터를 검색하여 결과를 얻었습니다.
  • 해당 상황에서 Transaction2가 접근하여 해당 조건의 데이터 일부를 삭제/추가하면, 종료되지 않은 Transaction1이 다시 해당 조건으로 데이터를 조회할 경우 Transaction2에서 추가/삭제된 데이터가 함께 조회/누락 됩니다.
  • 이후 Transaction2가 롤백을 하면 데이터가 꼬이게 됩니다.

# 반복 가능하지 않은 조회 (Non-Repeatable Read)

정의

반복 가능하지 않은 조회는 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 경우를 가리킵니다.

  • Transaction1이 데이터를 Read할 때, Transaction2가 데이터에 접근하여 값을 변경하거나 데이터를 삭제 후 커밋합니다.
  • 이후 Transaction1이 해당 데이터를 다시 read하려고 하면 변경 또는 삭제된 데이터를 조회하게 됩니다.

팬텀리드와 다른 점은 반복 가능하지 않은 조회는 행 값이 달라질 수 있는데, 팬텀 리드는 다른 행이 선택될 수 도 있따는 것을 의미합니다.

# 더티 리드 (Dirty Read)

정의

더티 리드는 반복 가능하지 않은 조회와 유사하며 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 행의 데이터를 읽을 수 있을 떄 발생합니다.

  • Transaction1이 데이터에 접근하여 값을 'A'에서 'B'로 변경 후 아직 커밋하지 않은 상태에서, Transaction2가 해당 데이터를 read하면 'B'를 읽게 됩니다.
  • 이 때 Transaction1이 최종 커밋을 하지 않고 종료되면, Transaction2가 가진 데이터가 꼬이게 됨.

# 격리 수준

# SERIALIZABLE

정의

SERIALIZABLE은 말 그대로 트랜잭션을 순차적으로 진행시키는 것을 말하며, 여러 트랜잭션이 동시에 같은 행에 접근 할 수 없습니다.

  • 매우 엄격한 격리 수준으로 해당 행에 대해 격리시키고, 이후 트랜잭션이 이 행에 대해 일어난다면, 기다려야 합니다.
  • 모든 것이 순차적으로 진행되므로 Phantom Read가 발생하지 않습니다.
  • 그렇기에 교착상태가 일어날 확률도 많고 가장 성능이 떨어지는 격리 수준입니다.
  • 따라서 데이터베이스에서 거의 사용되지 않습니다.

# REPEATABLE READ

정의

REPEATABLE READ는 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것을 막지 않습니다.

image

  • 따라서 트랜잭션 이후에 추가된 행이 발견될 수 있습니다.

# READ COMMITTED

정의

READ COMMITTED는 다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없습니다. 즉 커밋이 완료된 데이터에 대해서만 조회를 할 수 있습니다.

image

  • 가장 많이 사용되는 격리 수준이며, MySQL8.0, PostgreSQL, SQL Server, Oracle에서 기본값으로 설정되어 있습니다.
  • 하지만 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있기에 같은 행을 두번 읽을 때 다른 내용이 발견 될 수 있습니다.

# READ UNCOMMITTED

정의

READ UNCOMMITTED란 한 트랜잭션의 변경된 내용을 COMMIT이나 ROLLBACK과 상관 없이 다른 트랜잭션에서 읽을 수 있는 격리수준입니다.

image

  • 가장 낮은 격리 수준으로, 하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는 문제가 있으나 가장 빠릅니다.
  • 데이터 무결성을 위해 되도록이면 사용하지 않은 것이 이상적이나, 몇몇 행이 제대로 조회되지 않더라도 괜찮은 거대한 양의 데이터를 어림잡아 집계하는 데 사용하면 좋습니다.

# 지속성 (Durability)

정의

지속성이란 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미합니다.

  • 이는 데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 함을 뜻합니다.
  • 데이터베이스는 이를 위해 체크섬, 저널링, 롤백 등의 기능을 제공합니다.

용어

체크섬
중복검사의 한 형태로, 오류 정정을 통해 송신된 자료의 무결성을 보호하는 단순한 방법

저널링
파일 시스템 또는 데이터베이스 시스템에 변경사항을 커밋하기 전에 로깅하는 것
트랜잭션 등 변경 사항에 대한 로그를 남기는 것

# 무결성

정의

무결성이란 데이터의 정확성, 일관성, 유효성을 유지하는 것을 말합니다.

  • 무결성이 유지되어야 데이터베이스에 저장된 데이터 값과 그 값에 해당하는 현실 세계의 실제 값이 일치하는지에 대한 신뢰가 생십니다.
이름 설명
개체 무결성 기본키로 선택된 필드는 빈 값을 허용하지 않습니다.
참조 무결성 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 합니다.
고유 무결성 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 그 속성 값은 모두 고유한 값을 가집니다.
NULL 무결성 특정 속정 값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성 값은 NULL이 될 수 없다는 제약 조건입니다.

# 참고자료